
//----------宏定义------------
#define TIK_MAX 10
#define PWM_MAX 512

//---------- 函数 ------------
int ReadCmd(int *cmd,int *data) ; 
void hdriver(int pwm ) ;
//---------- 引脚 ------------
int ledpin=13;//指定LED端口 13
int pwma = 11;
int pwmb = 12;
//---------- 变量 ------------
int cmd; 
int data;
int tik ;
int out=0;
int dir = 0;
int pwmcnt ; 
void setup()
{
  pinMode(ledpin,OUTPUT);//设置端口13为输出模式
  pinMode(pwma,OUTPUT);//
  pinMode(pwmb,OUTPUT);//
  Serial.begin(115200);//设置串口波特率为115200

  tik=0 ;
  out=0;
  dir = 0;
  pwmcnt= 0 ;
  digitalWrite(pwma, LOW);
  digitalWrite(pwmb, LOW);
}


void loop()
{
	if(0 == ReadCmd(&cmd,&data)  ){
		Serial.print(cmd);
		Serial.println(data);
		delayMicroseconds(1);  //延时 us
  	}
	
	if(tik == TIK_MAX ){
		pwmcnt = pwmcnt <PWM_MAX-1 ? 0 : pwmcnt+1 ;

		if(dir=0){
			out = out < PWM_MAX -1  ? out+1 : PWM_MAX -1 ;
			dir = out < PWM_MAX -1  ? 0 :1 ;
		} 
		else if(dir=1){
			out = -out < PWM_MAX -1  ? out-1 : -(PWM_MAX -1) ;
			dir = -out < PWM_MAX -1  ? 1 :0 ;
		}
	//	hdriver(out);
		
	}
	

  	if(tik == TIK_MAX ) digitalWrite(ledpin, HIGH);
    else if(tik == TIK_MAX>>1 ) digitalWrite(ledpin, LOW);
  	tik = tik >= TIK_MAX ? 0:tik+1 ; 
} 



void hdriver(int pwm ) {
	if(pwm>0) {
		pwma = PWM_MAX > pwm ? 1 : 0 ;
		pwmb=0;
	} 
	else if(pwm<0) {
		pwmb = PWM_MAX < -pwm ? 1 : 0 ;
		pwma=0;
	} else {
		pwma = 0 ;
		pwmb = 0;		
	}

	if(pwma==1)digitalWrite(pwma, HIGH) ;
	else digitalWrite(pwma, LOW) ;

	if(pwmb==1)digitalWrite(pwmb, HIGH) ;
	else digitalWrite(pwmb, LOW) ;
}

/*********************************************
 * 读取串口指令和数据
 * 要求出口发送过来的数据以c为头，c后为char的命令，d后为int数据，支持-号，e为结束符
 * 如：c12d123e
 * 该函数请尽量放在主函数的循环体中
 * *cmd, *data 的值为转换后的数据
 * 返回值:当接收到的数据满足格式要求，且接收完毕，返回0 ，否则返回1
 ********************************************/
int ReadCmd(int *cmd,int *data){
	char c=0;
	static char uart_cin_cmd = 0;
	static int uart_cin_data = 0;
	static char uart_cin_status = 0;  //接受指令的状态 ，和下一个状态
	static int uart_cin_flag = 1;  //
	int uart_cin_fuhao_valid = 1;   //data符号（+-）有效标志位
	while(Serial.available() > 0)
	{
		c = char(Serial.read());
		// 状态机状态切换  -----  解析数据格式 ------
		switch(c){
			case('c'):uart_cin_status = (uart_cin_status==0)?1:0; uart_cin_cmd = 0;continue; //收到指令帧头 将标志设为1，准备接受 命令
			case('d'):{ //收到数据标志 将会读取数据的符号 + -
				if(uart_cin_status==1){
					uart_cin_status = 2;
					uart_cin_data = 0;
				}  else {
					uart_cin_status = 0;
				}
				continue;
			}
			case('e'):{
				if(uart_cin_status==2){
					uart_cin_status = 0;
					*cmd = uart_cin_cmd;
					*data =uart_cin_flag*uart_cin_data ;
					uart_cin_fuhao_valid = 1;
					uart_cin_flag=1;
					return 0;
				} // 接收到数据接收结束标椎   回到初始状态
			}
			default:break;
		}
		switch(uart_cin_status){
			case(1):{
				if(c>='0'&&c<='9')uart_cin_cmd=10*uart_cin_cmd+(c-'0') ;
				else uart_cin_status = 0;
				break;
			}
			case(2):{
				if(c>='0'&&c<='9')uart_cin_data=10*uart_cin_data+(c-'0') ;
				else if( c=='-' && uart_cin_flag ==1 && uart_cin_fuhao_valid==1 ) { uart_cin_flag = -1;uart_cin_fuhao_valid=0;}
				else uart_cin_status = 0;
				break;
			}
			default:{ //复位
				uart_cin_data = 0;
				uart_cin_flag = 1;
				uart_cin_cmd = 0;
				uart_cin_fuhao_valid=1;
			}
		}
	}
	return 1;
}


